﻿using System;
using System.Windows;
using System.Windows.Navigation;
using Croxweb.Leuphana.Services.MyStudyService;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using Croxweb.Leuphana.Services.StorageService;

namespace Croxweb.Leuphana
{
    public partial class App : Application
    {
        private static IScheduleStore scheduleStore = null;

        public static IScheduleStore ScheduleStore
        {
            get
            {
                if (scheduleStore == null)
                    scheduleStore = new PhoneScheduleStore();

                return scheduleStore;
            }
        }
        
        private static IMyStudyService myStudyService = null;

        public static IMyStudyService MyStudyService
        {
            get
            {
                if (myStudyService == null)
                {
                    MyStudyCredentials credentials = new MyStudyCredentials(Config.Username, Config.Password, Config.Semester);

                    myStudyService = new MyStudyService(credentials);
                }

                return myStudyService;
            }
        }

        private static ISettingStore config = null;

        public static ISettingStore Config
        {
            get
            {
                if (config == null)
                    config = new PhoneSettingStore();

                return config;
            }
        }

        /// <summary>
        /// Bietet einen einfachen Zugriff auf den Stammframe der Phone-Anwendung.
        /// </summary>
        /// <returns>Der Stammframe der Phone-Anwendung.</returns>
        public PhoneApplicationFrame RootFrame { get; private set; }

        /// <summary>
        /// Konstruktor für das Application-Objekt.
        /// </summary>
        public App()
        {
            // Globaler Handler für nicht abgefangene Ausnahmen. 
            UnhandledException += Application_UnhandledException;

            // Während des Debuggens Profilerstellungsinformationen zur Grafikleistung anzeigen.
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // Zähler für die aktuelle Bildrate anzeigen.
                Application.Current.Host.Settings.EnableFrameRateCounter = true;

                // Bereiche der Anwendung hervorheben, die mit jedem Bild neu gezeichnet werden.
                //Application.Current.Host.Settings.EnableRedrawRegions = true;

                // Nicht produktiven Visualisierungsmodus für die Analyse aktivieren, 
                // in dem GPU-beschleunigte Bereiche der Seite farbig hervorgehoben werden.
                //Application.Current.Host.Settings.EnableCacheVisualization = true;
            }

            // Silverlight-Standardinitialisierung
            InitializeComponent();

            // Phone-spezifische Initialisierung
            InitializePhoneApplication();
        }

        #region Application lifecycle

        private void Application_Launching(object sender, LaunchingEventArgs e)
        {

        }

        private void Application_Activated(object sender, ActivatedEventArgs e)
        {

        }

        private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
            // Sicherstellen, dass der erforderliche Anwendungszustand hier beibehalten wird
        }

        private void Application_Closing(object sender, ClosingEventArgs e)
        {
        }

        #endregion

        private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // Navigationsfehler. Unterbrechen und Debugger öffnen
                System.Diagnostics.Debugger.Break();
            }
        }

        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // Eine nicht behandelte Ausnahme ist aufgetreten. Unterbrechen und Debugger öffnen
                System.Diagnostics.Debugger.Break();
            }
        }

        #region Initialisierung der Phone-Anwendung

        // Doppelte Initialisierung vermeiden
        private bool phoneApplicationInitialized = false;

        // Fügen Sie keinen zusätzlichen Code zu dieser Methode hinzu
        private void InitializePhoneApplication()
        {
            if (phoneApplicationInitialized)
                return;

            // Frame erstellen, aber noch nicht als RootVisual festlegen. Dadurch kann der Begrüßungsbildschirm
            // aktiv bleiben, bis die Anwendung bereit für das Rendern ist.
            // RootFrame = new PhoneApplicationFrame();
            RootFrame = new TransitionFrame();
            RootFrame.Navigated += CompleteInitializePhoneApplication;

            // Navigationsfehler behandeln
            RootFrame.NavigationFailed += RootFrame_NavigationFailed;

            // Sicherstellen, dass keine erneute Initialisierung erfolgt
            phoneApplicationInitialized = true;
        }

        // Fügen Sie keinen zusätzlichen Code zu dieser Methode hinzu
        private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
        {
            // Visuelle Stammkomponente festlegen, sodass die Anwendung gerendert werden kann
            if (RootVisual != RootFrame)
                RootVisual = RootFrame;

            // Dieser Handler wird nicht mehr benötigt und kann entfernt werden
            RootFrame.Navigated -= CompleteInitializePhoneApplication;
        }

        #endregion
    }
}